JSON 函数和操作符
最近更新时间: 2024-10-17 17:10:00
JSON 和 JSONB 操作符
操作符 | 描述 |
---|---|
-> | 获得 JSON 数组元素/通过键获得 JSON 对象域 |
->> | 以文本形式获得 JSON 数组元素/对象域 |
#> | 获取在指定路径的 JSON 对象 |
#>> | 以文本形式获取在指定路径的 JSON 对象 |
示例:
postgres=# SELECT '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2;
?column?
-------------
{"c":"baz"}
(1 row)
postgres=# SELECT '{"a": {"b":"foo"}}'::json->'a';
?column?
-------------
{"b":"foo"}
(1 row)
postgres=# SELECT '[1,2,3]'::json->>2;
?column?
----------
3
(1 row)
postgres=# SELECT '{"a":1,"b":2}'::json->>'b';
?column?
----------
2
(1 row)
postgres=# SELECT '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}';
?column?
--------------
{"c": "foo"}
(1 row)
JSON 创建函数
函数 | 描述 |
---|---|
to_json(anyelement) to_jsonb(anyelement) | 把值返回为 json 或者 jsonb。数组和组合被(递归地)转换成数组和对象;否则,如果有从该类型到 json 的投影,将使用该投影函数来执行转换; 否则将产生一个标量值。对任何一个数值、布尔量或空值的标量类型, 将使用其文本表达,以这样一种方式使其成为有效的 json 或者 jsonb 值 |
array_to_json (anyarray [, pretty_bool]) | 把数组作为一个 JSON 数组返回。一个多维数组会成为一个数组 的 JSON 数组。如果 pretty_bool 为真,将在 第1维度的元素之间增加换行 |
row_to_json (record [, pretty_bool]) | 把行作为一个 JSON 对象返回。如果 pretty_bool 为真,将在第1层元素之间增加换行 |
json_build_array (VARIADIC "any") jsonb_build_array (VARIADIC "any") | 从一个可变参数列表构造一个可能包含异质类型的 JSON 数组 |
json_build_object (VARIADIC "any") jsonb_build_object (VARIADIC "any") | 从一个可变参数列表构造一个 JSON 对象。通过转换,该参数列表由交替出现的键和值构成 |
json_object(text[]) jsonb_object(text[]) | 从一个文本数组构造一个 JSON 对象。该数组必须可以是具有偶数个成员的一维数组(成员被当做交替出现的键/值对),或者是一个二维数组(每一个 内部数组刚好有2个元素,可以被看做是键/值对) |
json_object (keys text[], values text[]) jsonb_object (keys text[], values text[]) | json_object 的这种形式从两个独立的数组得到键/值对,在其他方面和一个参数的形式相同 |
示例:
postgres=# SELECT '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}';
?column?
--------------
{"c": "foo"}
(1 row)
postgres=# SELECT to_json('Fred said "Hi."'::text);
to_json
---------------------
"Fred said \"Hi.\""
(1 row)
postgres=# SELECT array_to_json('{{1,5},{99,100}}'::int[]);
array_to_json
------------------
[[1,5],[99,100]]
(1 row)
postgres=# SELECT row_to_json(row(1,'foo'));
row_to_json
---------------------
{"f1":1,"f2":"foo"}
(1 row)
postgres=# SELECT json_build_array(1,2,'3',4,5);
json_build_array
-------------------
[1, 2, "3", 4, 5]
(1 row)
postgres=# SELECT json_build_object('foo',1,'bar',2);
json_build_object
------------------------
{"foo" : 1, "bar" : 2}
(1 row)
postgres=# SELECT json_object('{a, 1, b, "def", c, 3.5}');
json_object
---------------------------------------
{"a" : "1", "b" : "def", "c" : "3.5"}
(1 row)
postgres=# SELECT json_object('{{a, 1},{b, "def"},{c, 3.5}}');
json_object
---------------------------------------
{"a" : "1", "b" : "def", "c" : "3.5"}
(1 row)
postgres=# SELECT json_object('{a, b}', '{1,2}');
json_object
------------------------
{"a" : "1", "b" : "2"}
(1 row)
JSON 处理函数
函数 | 描述 |
---|---|
json_array_length(json) jsonb_array_length(jsonb) | 返回最外层 JSON 数组中的元素数量 |
json_each(json) jsonb_each(jsonb) | 扩展最外层的 JSON 对象成为一组键/值对 |
json_each_text(json) jsonb_each_text(jsonb) | 扩展最外层的 JSON 对象成为一组键/值对。返回值将是文本类型 |
json_object_keys(json) jsonb_object_keys(jsonb) | 返回最外层 JSON 对象中的键集合 |
json_array_elements(json) jsonb_array_elements(jsonb) | 把一个 JSON 数组扩展成一个 JSON 值的集合 |
json_array_elements_text(json) jsonb_array_elements_text(jsonb) | 把一个 JSON 数组扩展成一个 text 值集合 |
json_typeof(json) jsonb_typeof(jsonb) | 把最外层的 JSON 值的类型作为一个文本字符串返回。可能的类型是:object、array、string、number、boolean以及null |
jsonb_insert(target jsonb, path text[], new_value jsonb, [insert_after boolean]) | 返回被插入了 new_value 的 target。如果 path 指定的 target 节在一个 JSONB 数组中,new_value 将被插入到目标之前(insert_after 为 false,默认情况) 或者之后(insert_after 为真)。如果 path 指定的 target 节在一个 JSONB 对象内,则只有当 target 不存在时才插入 new_value。 对于面向路径的操作符来说,出现在 path 中的负整数表示从 JSON 数组的末尾开始计数。 |
示例:
postgres=# SELECT jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"');
jsonb_insert
-------------------------------
{"a": [0, "new_value", 1, 2]}
(1 row)
postgres=# SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]');
json_array_length
-------------------
5
(1 row)
postgres=# SELECT * FROM json_each('{"a":"foo", "b":"bar"}');
key | value
-----+-------
a | "foo"
b | "bar"
(2 rows)
postgres=# SELECT * FROM json_each_text('{"a":"foo", "b":"bar"}');
key | value
-----+-------
a | foo
b | bar
(2 rows)
postgres=# SELECT json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}');
json_object_keys
------------------
f1
f2
(2 rows)
postgres=# SELECT * FROM json_array_elements('[1,true, [2,false]]');
value
-----------
1
true
[2,false]
(3 rows)
postgres=# SELECT * FROM json_array_elements_text('["foo", "bar"]');
value
-------
foo
bar
(2 rows)